import org.apache.commons.pool.impl.GenericObjectPool;


public class PoolTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GenericObjectPool.Config config=new GenericObjectPool.Config();
		
		//参数maxActive指明能从池中借出的对象的最大数目。如果这个值不是正数，表示没有限制。 
		config.maxActive=2;
		
		/*参数whenExhaustedAction指定在池中借出对象的数目已达极限的情况下，调用它的borrowObject方法时的行为。可以选用的值有：  
        	GenericObjectPool.WHEN_EXHAUSTED_BLOCK，表示等待；  
        	GenericObjectPool.WHEN_EXHAUSTED_GROW，表示创建新的实例（不过这就使maxActive参数失去了意义）；  
        	GenericObjectPool.WHEN_EXHAUSTED_FAIL，表示抛出一个java.util.NoSuchElementException异常。*/  
		config.whenExhaustedAction= GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
		
		
		 /*参数maxWait指明若在对象池空时调用borrowObject方法的行为被设定成等待，最多等待多少毫秒。如果等待时间超过了这个数值，则会抛出一  
         	个java.util.NoSuchElementException异常。如果这个值不是正数，表示无限期等待。  */
		config.maxWait=1000*5;
		
		
	    //参数testOnBorrow设定在借出对象时是否进行有效性检查。   默认不检查
		config.testOnBorrow=false;
		
		//参数testOnBorrow设定在还回对象时是否进行有效性检查。    默认不检查
		config.testOnReturn=false;
		
		//参数timeBetweenEvictionRunsMillis，设定间隔每过多少毫秒进行一次后台对象清理的行动。如果这个值不是正数，则实际上不会进行后台对象清理。  
		config.timeBetweenEvictionRunsMillis=1000*60;
		
	    /* 参数numTestsPerEvictionRun，设定在进行后台对象清理时，每次检查几个对象。如果这个值不是正数，则每次检查的对象数是检查时池内对象的总数乘以这个  
         	值的负倒数再向上取整的结果――也就是说，如果这个值是-2（-3、-4、-5……）的话，那么每次大约检查当时池内对象总数的1/2（1/3、1/4、1/5……）左右。*/  
		config.numTestsPerEvictionRun=10;
		
		/* 参数minEvictableIdleTimeMillis，设定在进行后台对象清理时，视休眠时间超过了多少毫秒的对象为过期。过期的对象将被回收。如果这个值不是正数，那么  
        	对休眠时间没有特别的约束。  */
		config.minEvictableIdleTimeMillis=1000*10;
		
		//参数testWhileIdle，则设定在进行后台对象清理时，是否还对没有过期的池内对象进行有效性检查。不能通过有效性检查的对象也将被回收
		config.testWhileIdle=false;
		
		
		
		GenericObjectPool pool=new GenericObjectPool<BigObject>(new BigObjectFactory(), config);
		 try {
			//pool.addObject();
			//pool.addObject();
		} catch (Exception e) {
			e.printStackTrace();
		}

		
		try {
			BigObject b1=(BigObject) pool.borrowObject();
			BigObject b2=(BigObject) pool.borrowObject();
			//BigObject b3=(BigObject) pool.borrowObject();
			//BigObject b4=(BigObject) pool.borrowObject();
			
			pool.returnObject(b1);
			BigObject b5=(BigObject) pool.borrowObject();
			//pool.returnObject(b2);
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
